"""
面向 iftop 软件的 MCP Server

MCP tools 列表：
1. iftop_config_test - 测试 iftop 配置文件功能
   用途：测试 iftop 的各种配置选项，包括网络接口、DNS解析、端口解析、过滤规则等
   参数：config_file (str) - 配置文件路径
   返回：统一 JSON 结构

2. iftop_gui_test - 测试 iftop GUI 模式和交互功能  
   用途：测试 iftop 的图形界面功能和各种交互按键
   参数：options (List[str]) - 命令行选项列表
   返回：统一 JSON 结构

3. iftop_text_mode_test - 测试 iftop 文本模式
   用途：测试 iftop 在文本模式下的各种命令行选项
   参数：options (List[str]) - 命令行选项列表
   返回：统一 JSON 结构
"""

from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import List

mcp = FastMCP("iftop MCP Server")

@mcp.tool()
def iftop_config_test(config_file: str) -> dict:
    """
    测试 iftop 配置文件功能
    
    参数:
        config_file: 配置文件路径，包含 iftop 的各种配置选项
        
    返回 JSON 结构:
        {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 执行的完整命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出
            "stderr": str         # 标准错误
        }
    """
    try:
        # 使用配置文件运行 iftop
        cmd = ["iftop", "-c", config_file]
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(cmd),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": " ".join(cmd),
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command timed out"
        }
    except Exception as e:
        return {
            "success": False,
            "command": " ".join(cmd) if 'cmd' in locals() else "iftop -c " + config_file,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def iftop_gui_test(options: List[str]) -> dict:
    """
    测试 iftop GUI 模式和交互功能
    
    参数:
        options: 命令行选项列表，如 ["-b", "-n", "-F", "192.168.1.0/24"] 等
        
    返回 JSON 结构:
        {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 执行的完整命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出
            "stderr": str         # 标准错误
        }
    """
    try:
        # 构建 iftop 命令
        cmd = ["iftop"] + options
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(cmd),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": " ".join(cmd),
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command timed out"
        }
    except Exception as e:
        return {
            "success": False,
            "command": " ".join(cmd) if 'cmd' in locals() else "iftop " + " ".join(options),
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def iftop_text_mode_test(options: List[str]) -> dict:
    """
    测试 iftop 文本模式
    
    参数:
        options: 命令行选项列表，如 ["-t", "-s", "1", "-n", "-P"] 等
        
    返回 JSON 结构:
        {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 执行的完整命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出
            "stderr": str         # 标准错误
        }
    """
    try:
        # 构建 iftop 命令（文本模式通常使用 -t 选项）
        cmd = ["iftop"] + options
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(cmd),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": " ".join(cmd),
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command timed out"
        }
    except Exception as e:
        return {
            "success": False,
            "command": " ".join(cmd) if 'cmd' in locals() else "iftop " + " ".join(options),
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()